#include <stdio.h>
#include <string.h>
#include "uart_protocol.h"

// ESP32端实现的UART发送函数
void uart_send_data(uint8_t *data, uint8_t length)
{
    // 这里应该是实际的ESP32 UART发送实现
    // 在实际应用中，这里会调用ESP32的UART API
    printf("ESP32发送数据: ");
    for (int i = 0; i < length; i++) {
        printf("%02X ", data[i]);
    }
    printf("\n");
}

// 命令处理回调函数
void handle_command(uint8_t command, uint8_t *data, uint8_t length)
{
    switch (command) {
        case CMD_UV_CONTROL:
            printf("处理UV控制命令: %s\n", data[0] == STATUS_ON ? "开启" : "关闭");
            // 这里实现实际的UV控制逻辑
            break;
            
        case CMD_HYDROGEN_CONTROL:
            printf("处理制氢控制命令: %s\n", data[0] == STATUS_ON ? "开启" : "关闭");
            // 这里实现实际的制氢控制逻辑
            break;
            
        case CMD_LIGHT_COLOR:
            printf("处理灯光颜色命令: ");
            switch (data[0]) {
                case LIGHT_COLOR_RED:
                    printf("红色\n");
                    break;
                case LIGHT_COLOR_YELLOW:
                    printf("黄色\n");
                    break;
                case LIGHT_COLOR_BLUE:
                    printf("蓝色\n");
                    break;
                case LIGHT_COLOR_PURPLE:
                    printf("紫色\n");
                    break;
                case LIGHT_COLOR_GREEN:
                    printf("绿色\n");
                    break;
                case LIGHT_COLOR_CYAN:
                    printf("青色\n");
                    break;
                case LIGHT_COLOR_WHITE:
                    printf("白色\n");
                    break;
                default:
                    printf("未知颜色: %d\n", data[0]);
                    break;
            }
            // 这里实现实际的灯光颜色控制逻辑
            break;
            
        case CMD_LIGHT_MODE:
            printf("处理灯光模式命令: ");
            switch (data[0]) {
                case LIGHT_MODE_OFF:
                    printf("关闭\n");
                    break;
                case LIGHT_MODE_CONSTANT:
                    printf("常亮\n");
                    break;
                case LIGHT_MODE_BREATHING:
                    printf("呼吸\n");
                    break;
                case LIGHT_MODE_RAINBOW:
                    printf("七彩渐变\n");
                    break;
                default:
                    printf("未知模式: %d\n", data[0]);
                    break;
            }
            // 这里实现实际的灯光模式控制逻辑
            break;
            
        case CMD_BUZZER_CONTROL:
            if (data[0] == 0) {
                printf("处理蜂鸣器关闭命令\n");
            } else {
                printf("处理蜂鸣器控制命令: %d声\n", data[0]);
            }
            // 这里实现实际的蜂鸣器控制逻辑
            break;
            
        case CMD_CLEAN_CONTROL:
            printf("处理清洗控制命令: %s\n", data[0] == STATUS_ON ? "开启" : "关闭");
            // 这里实现实际的清洗控制逻辑
            break;
            
        case CMD_SHUTDOWN:
            printf("处理关机命令\n");
            // 这里实现实际的关机逻辑
            break;
            
        case CMD_BACKLIGHT_CONTROL:
            printf("处理背光控制命令: %s\n", data[0] == STATUS_ON ? "开启" : "关闭");
            // 这里实现实际的背光控制逻辑
            break;
            
        case CMD_CHARGE_STATUS:
            printf("处理充电状态上报: ");
            switch (data[0]) {
                case CHARGE_STATUS_NONE:
                    printf("未充电\n");
                    break;
                case CHARGE_STATUS_CHARGING:
                    printf("充电中\n");
                    break;
                case CHARGE_STATUS_COMPLETE:
                    printf("已充满\n");
                    break;
                default:
                    printf("未知状态: %d\n", data[0]);
                    break;
            }
            // 这里实现实际的充电状态处理逻辑
            break;
            
        case CMD_HEARTBEAT:
            printf("处理心跳包\n");
            // 这里实现实际的心跳包处理逻辑
            break;
            
        default:
            printf("未知命令: 0x%02X\n", command);
            break;
    }
}

// 模拟接收数据并解析
void process_received_data(uint8_t *data, uint8_t length)
{
    static protocol_parser_t parser;
    static bool parser_initialized = false;
    
    if (!parser_initialized) {
        protocol_init(&parser);
        parser_initialized = true;
    }
    
    for (int i = 0; i < length; i++) {
        if (protocol_parse_byte(&parser, data[i])) {
            if (protocol_validate_frame(&parser.frame)) {
                handle_command(parser.frame.command, parser.frame.data, parser.frame.length);
            } else {
                printf("帧校验失败\n");
            }
        }
    }
}

// 模拟ESP32主程序
void app_main(void)
{
    printf("ESP32 UART通讯协议示例程序\n");
    
    // 模拟发送命令
    printf("\n发送开UV灯命令\n");
    esp32_send_uv_control(STATUS_ON);
    
    printf("\n发送灯光颜色-红灯命令\n");
    esp32_send_light_color(LIGHT_COLOR_RED);
    
    printf("\n发送灯光模式-常亮命令\n");
    esp32_send_light_mode(LIGHT_MODE_CONSTANT);
    
    printf("\n发送蜂鸣器一声命令\n");
    esp32_send_buzzer_control(1);
    
    // 模拟接收数据
    printf("\n模拟接收数据\n");
    
    // 模拟接收充电状态上报
    uint8_t charge_data[] = {0xAA, 0x55, 0x01, 0x20, 0x01, 0x20, 0x0D, 0x0A};
    process_received_data(charge_data, sizeof(charge_data));
    
    // 模拟接收心跳包
    uint8_t heartbeat_data[] = {0xAA, 0x55, 0x01, 0x31, 0x00, 0x30, 0x0D, 0x0A};
    process_received_data(heartbeat_data, sizeof(heartbeat_data));
}

// 用于非ESP-IDF环境的主函数
#ifndef CONFIG_IDF_TARGET
int main(void)
{
    app_main();
    return 0;
}
#endif 